import base64
import json
import logging
import random
import string
import datetime
import requests
import os
import uuid
import re
import zlib
import hashlib

# 设置日志
def setup_logger(level=logging.INFO):
    logging.basicConfig(level=level, format="%(asctime)s - %(levelname)s - %(message)s")

setup_logger()

# 编解码工具
def base64_encode(data: str) -> str:
    return base64.b64encode(data.encode()).decode()

def base64_decode(encoded_data: str) -> str:
    return base64.b64decode(encoded_data).decode()

def json_encode(data: dict) -> str:
    return json.dumps(data, indent=4)

def json_decode(json_str: str) -> dict:
    try:
        return json.loads(json_str)
    except json.JSONDecodeError as e:
        logging.error(f"JSON 解码失败：{e}")
        return None

def json_format_and_validate(json_str: str) -> str:
    """格式化 JSON 字符串并检查错误"""
    try:
        parsed_json = json.loads(json_str)
        formatted_json = json.dumps(parsed_json, indent=4)
        return formatted_json
    except json.JSONDecodeError as e:
        logging.error(f"JSON 格式错误：{e}")
        return f"格式错误：{e}"

# 字符串工具
def to_uppercase(s: str) -> str:
    return s.upper()

def to_lowercase(s: str) -> str:
    return s.lower()

def toggle_case(s: str) -> str:
    """大小写切换"""
    return s.swapcase()

def camel_case(s: str) -> str:
    """将下划线分隔的字符串或普通字符串转换为驼峰命名，支持连续英文单词"""
    # 使用正则表达式分割字符串，保留单词边界
    words = re.split(r'[_\s]+', s)
    # 处理每个单词，首字母小写，其余单词首字母大写
    return words[0].lower() + ''.join(word.capitalize() for word in words[1:])

def random_string(length: int) -> str:
    return ''.join(random.choices(string.ascii_letters + string.digits, k=length))

def generate_uuid() -> str:
    """生成 UUID"""
    return str(uuid.uuid4())

# 数据处理工具
def format_datetime(dt: datetime.datetime, fmt: str = "%Y-%m-%d %H:%M:%S") -> str:
    return dt.strftime(fmt)

def parse_datetime(date_str: str, fmt: str = "%Y-%m-%d %H:%M:%S") -> datetime.datetime:
    return datetime.datetime.strptime(date_str, fmt)

# 文件操作工具
def read_file(file_path: str, encoding: str = "utf-8") -> str:
    """读取文件内容，支持指定编码"""
    try:
        with open(file_path, "r", encoding=encoding) as f:
            return f.read()
    except UnicodeDecodeError:
        logging.error("文件编码错误，请检查文件编码是否为 UTF-8")
        return ""
    except FileNotFoundError:
        logging.error("文件不存在")
        return ""

def write_file(file_path: str, content: str, encoding: str = "utf-8") -> None:
    """将内容写入文件，支持指定编码"""
    with open(file_path, "w", encoding=encoding) as f:
        f.write(content)

# 哈希工具
def generate_crc32(data: str) -> str:
    """生成 CRC32 值"""
    return hex(zlib.crc32(data.encode()))[2:]

def generate_md5(data: str) -> str:
    """生成 MD5 值"""
    return hashlib.md5(data.encode()).hexdigest()

# HTTP 请求工具
def http_get(url: str, params: dict = None) -> dict:
    response = requests.get(url, params=params)
    return response.json()

def http_post(url: str, data: dict = None) -> dict:
    response = requests.post(url, json=data)
    return response.json()

# 菜单驱动的工具软件
def show_menu():
    print("\n欢迎使用工具软件，请选择一个工具：")
    print("1. Base64 编解码")
    print("2. JSON 工具")
    print("3. 字符串操作")
    print("4. 数据处理")
    print("5. 文件操作")
    print("6. 哈希工具")
    print("7. HTTP 请求")
    print("0. 退出")
    choice = input("请输入选项（0-7）：")
    return choice

def base64_tool():
    print("\n欢迎使用 Base64 编解码工具")
    print("1. 编码")
    print("2. 解码")
    choice = input("请选择操作（1 或 2）：")
    if choice == "1":
        data = input("请输入要编码的字符串：")
        result = base64_encode(data)
        print(f"编码结果：{result}")
    elif choice == "2":
        encoded_data = input("请输入要解码的 Base64 字符串：")
        try:
            result = base64_decode(encoded_data)
            print(f"解码结果：{result}")
        except Exception as e:
            print(f"解码失败：{e}")
    else:
        print("无效选项！")

def json_tool():
    print("\n欢迎使用 JSON 工具")
    print("1. 编码")
    print("2. 解码")
    print("3. 格式化并检查 JSON")
    choice = input("请选择操作（1-3）：")
    if choice == "1":
        data = input("请输入要编码的 Python 对象（字典格式）：")
        try:
            result = json_encode(eval(data))
            print(f"编码结果：\n{result}")
        except Exception as e:
            print(f"编码失败：{e}")
    elif choice == "2":
        json_str = input("请输入要解码的 JSON 字符串：")
        result = json_decode(json_str)
        if result is not None:
            print(f"解码结果：\n{result}")
    elif choice == "3":
        json_str = input("请输入要格式化和检查的 JSON 字符串：")
        result = json_format_and_validate(json_str)
        print(f"格式化结果：\n{result}")
    else:
        print("无效选项！")

def string_tool():
    print("\n欢迎使用字符串操作工具")
    print("1. 转换为大写")
    print("2. 转换为小写")
    print("3. 生成随机字符串")
    print("4. 生成 UUID")
    print("5. 大小写切换")
    print("6. 驼峰化")
    choice = input("请选择操作（1-6）：")
    if choice == "1":
        s = input("请输入字符串：")
        result = to_uppercase(s)
        print(f"结果：{result}")
    elif choice == "2":
        s = input("请输入字符串：")
        result = to_lowercase(s)
        print(f"结果：{result}")
    elif choice == "3":
        length = int(input("请输入随机字符串的长度："))
        result = random_string(length)
        print(f"生成的随机字符串：{result}")
    elif choice == "4":
        result = generate_uuid()
        print(f"生成的 UUID：{result}")
    elif choice == "5":
        s = input("请输入字符串：")
        result = toggle_case(s)
        print(f"大小写切换结果：{result}")
    elif choice == "6":
        s = input("请输入字符串：")
        result = camel_case(s)
        print(f"驼峰化结果：{result}")
    else:
        print("无效选项！")

def data_tool():
    print("\n欢迎使用数据处理工具")
    print("1. 格式化日期时间")
    print("2. 解析日期时间")
    choice = input("请选择操作（1 或 2）：")
    if choice == "1":
        dt = input("请输入日期时间（格式：YYYY-MM-DD HH:MM:SS）：")
        fmt = input("请输入目标格式（默认：%Y-%m-%d %H:%M:%S）：") or "%Y-%m-%d %H:%M:%S"
        try:
            dt_obj = datetime.datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")
            result = format_datetime(dt_obj, fmt)
            print(f"格式化结果：{result}")
        except Exception as e:
            print(f"格式化失败：{e}")
    elif choice == "2":
        date_str = input("请输入日期时间字符串：")
        fmt = input("请输入日期时间格式（默认：%Y-%m-%d %H:%M:%S）：") or "%Y-%m-%d %H:%M:%S"
        try:
            result = parse_datetime(date_str, fmt)
            print(f"解析结果：{result}")
        except Exception as e:
            print(f"解析失败：{e}")
    else:
        print("无效选项！")

def file_tool():
    print("\n欢迎使用文件操作工具")
    print("1. 读取文件")
    print("2. 写入文件")
    choice = input("请选择操作（1 或 2）：")
    if choice == "1":
        file_path = input("请输入文件路径：")
        content = read_file(file_path)
        if content:
            print(f"文件内容：\n{content}")
    elif choice == "2":
        file_path = input("请输入文件路径：")
        content = input("请输入要写入的内容：")
        write_file(file_path, content)
        print("文件写入成功！")
    else:
        print("无效选项！")

def hash_tool():
    print("\n欢迎使用哈希工具")
    print("1. 生成 CRC32")
    print("2. 生成 MD5")
    choice = input("请选择操作（1 或 2）：")
    if choice == "1":
        data = input("请输入要生成 CRC32 的字符串：")
        result = generate_crc32(data)
        print(f"CRC32 结果：{result}")
    elif choice == "2":
        data = input("请输入要生成 MD5 的字符串：")
        result = generate_md5(data)
        print(f"MD5 结果：{result}")
    else:
        print("无效选项！")

def http_tool():
    print("\n欢迎使用 HTTP 请求工具")
    print("1. 发送 GET 请求")
    print("2. 发送 POST 请求")
    choice = input("请选择操作（1 或 2）：")
    if choice == "1":
        url = input("请输入请求的 URL：")
        params = input("请输入请求参数（字典格式，可选）：")
        try:
            params = eval(params) if params else None
            result = http_get(url, params)
            print(f"请求结果：{result}")
        except Exception as e:
            print(f"请求失败：{e}")
    elif choice == "2":
        url = input("请输入请求的 URL：")
        data = input("请输入请求数据（字典格式）：")
        try:
            data = eval(data)
            result = http_post(url, data)
            print(f"请求结果：{result}")
        except Exception as e:
            print(f"请求失败：{e}")
    else:
        print("无效选项！")

def main():
    while True:
        choice = show_menu()
        if choice == "0":
            print("感谢使用，再见！")
            break
        elif choice == "1":
            base64_tool()
        elif choice == "2":
            json_tool()
        elif choice == "3":
            string_tool()
        elif choice == "4":
            data_tool()
        elif choice == "5":
            file_tool()
        elif choice == "6":
            hash_tool()
        elif choice == "7":
            http_tool()
        else:
            print("无效选项，请重新选择！")

if __name__ == "__main__":
    main()
    